﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Li.DingTalk.Model.Contacts
{
    /// <summary>
    /// 部门获取处理类  handel
    /// </summary>
    public class departmentHD
    {
        /// <summary>
        /// 获取子部门ID列表
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="id">父部门id</param>
        public static departmentIds GetDepartmentIds(string access_token, string id)
        {
            var path = string.Format("https://oapi.dingtalk.com/department/list_ids?access_token={0}&id={1}", access_token, id);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<departmentIds>(resultJson);
        }

        /// <summary>
        /// 获取部门列表
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="id">父部门id</param>
        /// <param name="lang"></param>
        /// <returns></returns>
        public static departmentlist list(string access_token, string id, string lang = "zh_CN")
        {
            var path = string.Format("https://oapi.dingtalk.com/department/list?access_token={0}&id={1}&lang={2}", access_token, id, lang);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<departmentlist>(resultJson);
        }

        /// <summary>
        /// 获取部门详情
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="id">部门iD</param>
        /// <param name="lang"></param>
        /// <returns></returns>
        public static departmentMS Getdepartmentlist(string access_token, string id, string lang = "zh_CN")
        {
            var path = string.Format("https://oapi.dingtalk.com/department/get?access_token={0}&id={1}&lang={2}", access_token, id, lang);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<departmentMS>(resultJson);
        }

        /// <summary>
        /// 创建部门
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="cds">创建部门信息结构体</param>
        /// <returns></returns>
        public static createdepartment Createdepartment(string access_token, createdepartmentstructural cds)
        {
            var path = string.Format("https://oapi.dingtalk.com/department/create?access_token={0}", access_token);
            var StrJson = Newtonsoft.Json.JsonConvert.SerializeObject(cds);
            var Create = RequestHelper.Post(path, StrJson);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<createdepartment>(Create);
        }

        /// <summary>
        /// 更新部门
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="uds">更新部门信息结构体</param>
        /// <returns></returns>
        public static ResultPackage Updatepartment(string access_token, updatedepartmentstructural uds)
        {
            var path = string.Format("https://oapi.dingtalk.com/department/update?access_token={0}", access_token);
            var StrJson = Newtonsoft.Json.JsonConvert.SerializeObject(uds);
            var Update = RequestHelper.Post(path, StrJson);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<ResultPackage>(Update);
        }

        /// <summary>
        /// 删除部门
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="id">部门iD</param>
        /// <returns></returns>
        public static ResultPackage Deletedepartment(string access_token, long id)
        {
            var path = string.Format("https://oapi.dingtalk.com/department/delete?access_token={0}&id={1}", access_token, id);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<ResultPackage>(resultJson);
        }

        /// <summary>
        /// 查询部门的所有上级父部门路径
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="id">部门iD</param>
        /// <returns></returns>
        public static queryallparentdepartmentlist Queryallparentdepartment(string access_token, long id)
        {
            var path = string.Format("https://oapi.dingtalk.com/department/list_parent_depts_by_dept?access_token={0}&id={1}", access_token, id);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<queryallparentdepartmentlist>(resultJson);
        }

        /// <summary>
        /// 查询指定用户的所有上级父部门路径
        /// </summary>
        /// <param name="access_token"></param>
        /// <param name="userid">人员iD</param>
        /// <returns></returns>
        public static queryappointuserparentdepartmentlist Queryappointparentdepartment(string access_token, string userid)
        {
            var path = string.Format("https://oapi.dingtalk.com/department/list_parent_depts?access_token={0}&userId={1}", access_token, userid);
            string resultJson = RequestHelper.Get(path);
            return Newtonsoft.Json.JsonConvert.DeserializeObject<queryappointuserparentdepartmentlist>(resultJson);
        }

    }

    #region 部门信息

    public class departmentIds : ResultPackage
    {
        public long[] sub_dept_id_list { get; set; }
    }
    /// <summary>
    /// 部门列表简写
    /// </summary>
    public class departmentlist: ResultPackage
    {
        public List<department> department
        {
            get;set;
        }
    }
    /// <summary>
    /// 部门列表简写
    /// </summary>
    public class department : ResultPackage
    {
        public int id
        {
            get; set;
        }

        public string name
        {
            get; set;
        }
        /// <summary>
        /// 父部门id，根部门为1
        /// </summary>
        public int parentid
        {
            get; set;
        }
        /// <summary>
        /// 是否同步创建一个关联此部门的企业群, true表示是, false表示不是
        /// </summary>
        public bool createDeptGroup
        {
            get; set;
        }
        /// <summary>
        /// 当群已经创建后，是否有新人加入部门会自动加入该群, true表示是, false表示不是
        /// </summary>
        public bool autoAddUser
        {
            get; set;
        }
    }
    /// <summary>
    /// 部门详细信息
    /// </summary>
    public class departmentMS: department
    {
        /// <summary>
        /// 在父部门中的次序值
        /// </summary>
        public int order
        {
            get;set;
        }
        /// <summary>
        /// 是否隐藏部门, true表示隐藏, false表示显示
        /// </summary>
        public bool deptHiding
        {
            get;
            set;
        }
        /// <summary>
        /// 可以查看指定隐藏部门的其他部门列表，如果部门隐藏，则此值生效，取值为其他的部门id组成的的字符串，使用|符号进行分割
        /// </summary>
        public string deptPerimits
        {
            get;
            set;
        }
        /// <summary>
        /// 可以查看指定隐藏部门的其他人员列表，如果部门隐藏，则此值生效，取值为其他的人员userid组成的的字符串，使用|符号进行分割
        /// </summary>
        public string userPerimits
        {
            get;
            set;
        }
        /// <summary>
        /// 是否本部门的员工仅可见员工自己, 为true时，本部门员工默认只能看到员工自己
        /// </summary>
        public bool outerDept
        {
            get;
            set;
        }
        /// <summary>
        /// 本部门的员工仅可见员工自己为true时，可以配置额外可见部门，值为部门id组成的的字符串，使用|符号进行分割
        /// </summary>
        public string outerPermitDepts
        {
            get;
            set;
        }
        /// <summary>
        /// 本部门的员工仅可见员工自己为true时，可以配置额外可见人员，值为userid组成的的字符串，使用| 符号进行分割
        /// </summary>
        public string outerPermitUsers
        {
            get;
            set;
        }
        /// <summary>
        /// 企业群群主
        /// </summary>
        public string orgDeptOwner
        {
            get;
            set;
        }
        /// <summary>
        /// 部门的主管列表,取值为由主管的userid组成的字符串，不同的userid使用|符号进行分割
        /// </summary>
        public string deptManagerUseridList
        {
            get;
            set;
        }

    }

    /// <summary>
    /// 创建部门的结构体
    /// </summary>
    public class createdepartmentstructural
    {
        /// <summary>
        ///部门名称。长度限制为1~64个字符。不允许包含字符‘-’‘，’以及‘,’。
        /// </summary>
        public string name
        {
            get;
            set;
        }
        /// <summary>
        /// 父部门id。根部门id为1
        /// </summary>
        public string parentid
        {
            get;
            set;
        }
        /// <summary>
        /// 在父部门中的次序值。order值小的排序靠前
        /// </summary>
        public string order
        {
            get;
            set;
        }
        /// <summary>
        /// 是否创建一个关联此部门的企业群，默认为false
        /// </summary>
        public bool createDeptGroup
        {
            get;
            set;
        }
        /// <summary>
        /// 是否隐藏部门, true表示隐藏, false表示显示
        /// </summary>
        public bool deptHiding
        {
            get;
            set;
        }
        /// <summary>
        /// 可以查看指定隐藏部门的其他部门列表，如果部门隐藏，则此值生效，取值为其他的部门id组成的的字符串，使用 | 符号进行分割。总数不能超过200。
        /// </summary>
        public string deptPerimits
        {
            get;
            set;
        }
        /// <summary>
        /// 可以查看指定隐藏部门的其他人员列表，如果部门隐藏，则此值生效，取值为其他的人员userid组成的的字符串，使用| 符号进行分割。总数不能超过200。
        /// </summary>
        public string userPerimits
        {
            get;
            set;
        }
        /// <summary>
        /// 是否本部门的员工仅可见员工自己, 为true时，本部门员工默认只能看到员工自己
        /// </summary>
        public bool outerDept
        {
            get;
            set;
        }
        /// <summary>
        /// 本部门的员工仅可见员工自己为true时，可以配置额外可见部门，值为部门id组成的的字符串，使用|符号进行分割。总数不能超过200。
        /// </summary>
        public string outerPermitDepts
        {
            get;
            set;
        }
        /// <summary>
        /// 本部门的员工仅可见员工自己为true时，可以配置额外可见人员，值为userid组成的的字符串，使用|符号进行分割。总数不能超过200。
        /// </summary>
        public string outerPermitUsers
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 创建部门
    /// </summary>
    public class createdepartment : ResultPackage
    {
        /// <summary>
        /// 创建的部门id
        /// </summary>
        public int id
        {
            get; set;
        }
    }

    /// <summary>
    /// 更新部门的结构体
    /// </summary>
    public class updatedepartmentstructural
    {
        /// <summary>
        ///部门名称。长度限制为1~64个字符。不允许包含字符‘-’‘，’以及‘,’。
        /// </summary>
        public string name
        {
            get;
            set;
        }
        /// <summary>
        /// 父部门id。根部门id为1
        /// </summary>
        public string parentid
        {
            get;
            set;
        }
        /// <summary>
        /// 在父部门中的次序值。order值小的排序靠前
        /// </summary>
        public string order
        {
            get;
            set;
        }
        /// <summary>
        /// 部门id
        /// </summary>
        public long id
        {
            get;
            set;
        }
        /// <summary>
        /// 是否创建一个关联此部门的企业群，默认为false
        /// </summary>
        public bool createDeptGroup
        {
            get;
            set;
        }
        /// <summary>
        /// 如果有新人加入部门是否会自动加入部门群
        /// </summary>
        public bool autoAddUser
        {
            get;
            set;
        }
        /// <summary>
        /// 部门的主管列表,取值为由主管的userid组成的字符串，不同的userid使用’| 符号进行分割
        /// </summary>
        public string deptManagerUseridList
        {
            get;
            set;
        }
        /// <summary>
        /// 是否隐藏部门, true表示隐藏, false表示显示
        /// </summary>
        public bool deptHiding
        {
            get;
            set;
        }
        /// <summary>
        /// 可以查看指定隐藏部门的其他部门列表，如果部门隐藏，则此值生效，取值为其他的部门id组成的的字符串，使用 | 符号进行分割。总数不能超过200。
        /// </summary>
        public string deptPerimits
        {
            get;
            set;
        }
        /// <summary>
        /// 可以查看指定隐藏部门的其他人员列表，如果部门隐藏，则此值生效，取值为其他的人员userid组成的的字符串，使用| 符号进行分割。总数不能超过200。
        /// </summary>
        public string userPerimits
        {
            get;
            set;
        }
        /// <summary>
        /// 是否本部门的员工仅可见员工自己, 为true时，本部门员工默认只能看到员工自己
        /// </summary>
        public bool outerDept
        {
            get;
            set;
        }
        /// <summary>
        /// 本部门的员工仅可见员工自己为true时，可以配置额外可见部门，值为部门id组成的的字符串，使用|符号进行分割。总数不能超过200。
        /// </summary>
        public string outerPermitDepts
        {
            get;
            set;
        }
        /// <summary>
        /// 本部门的员工仅可见员工自己为true时，可以配置额外可见人员，值为userid组成的的字符串，使用|符号进行分割。总数不能超过200。
        /// </summary>
        public string outerPermitUsers
        {
            get;
            set;
        }
        /// <summary>
        /// 企业群群主
        /// </summary>
        public string orgDeptOwner
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 查询部门的所有上级父部门路径
    /// </summary>
    public class queryallparentdepartmentlist : ResultPackage
    {
        /// <summary>
        /// 该部门的所有父部门id列表
        /// </summary>
        public long[] parentIds
        {
            get;
            set;
        }
    }

    /// <summary>
    /// 查询指定用户的所有上级父部门路径
    /// </summary>
    public class queryappointuserparentdepartmentlist : ResultPackage
    {
        /// <summary>
        /// 该部门的所有父部门id列表
        /// </summary>
        public int[][] department
        {
            get;
            set;
        }
    }
    #endregion
}
